package tech.aistar.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tech.aistar.service.IBookService;
import tech.aistar.service.ICashierService;

import java.util.List;

/**
 * 本类用来演示:
 *
 * @author: success
 * @date: 2021/5/7 3:45 下午
 */
@Service
//@Transactional(readOnly = true)
@Transactional
public class CashierServiceImpl implements ICashierService {
    //推荐 - 一个service尽量不要直接调用另外一个mapper
    //应该是一个service调用另外一个service...
    @Autowired
    private IBookService bookService;

    /**
     * @Transaction
     * 1. 当调用checkout业务方法的时候,就会开启一个新的事务T1
     *
     * 2. 当在checkout业务方法中调用另外一个业务方法purcase,
     *    purcase方法也使用了@Transaction
     *
     * 3. 事务的传播行为 - 默认行为REQUIRED
     *
     * 4. 采用默认的事务的传播行为就意味着purcase方法不会再去创建一个新的事务了
     *    而是主动直接加入到checkout方法调用时开启的事务T1
     *
     * 5. 当事务方法checkout运行结束,T1事务才会提交.
     *
     *
     *
     * 一个人买很多书的过程应该是同时成功,同时失败的.
     * @param username
     * @param bookIds
     */
    @Override
    public void checkout(String username, List<Integer> bookIds) {
        if(null!=bookIds && bookIds.size()>0){
            for (Integer bookId : bookIds) {
                bookService.purcase(username,bookId);
            }
        }
    }

}
